home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 7 / Apprentice-Release7.iso / Source Code / Pascal / Snippets / PNL Libraries / MyBase64.p < prev    next >
Encoding:
Text File  |  1996-07-19  |  1.5 KB  |  65 lines  |  [TEXT/CWIE]

  1. unit MyBase64;
  2.  
  3. interface
  4.  
  5.     uses
  6.         Types;
  7.         
  8.     function DecodeBase64( const src: Str255; var dst: Str255 ): Boolean;
  9.     
  10. implementation
  11.  
  12.     uses
  13.         MyAssertions;
  14.         
  15.     const
  16.         base64_chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
  17.         base64_pad = '=';
  18.         
  19.     function DecodeBase64( const src: Str255; var dst: Str255 ): Boolean;
  20.         var
  21.             map: array[char] of integer;
  22.             ch: char;
  23.             i, base: integer;
  24.             n: longint;
  25.             good: boolean;
  26.     begin
  27.         Assert( length(base64_chars) = 64 );
  28.         for ch := chr(0) to chr(255) do begin
  29.             map[ch] := -1;
  30.         end;
  31.         for i := 1 to 64 do begin
  32.             map[base64_chars[i]] := i -1;
  33.         end;
  34.         map[base64_pad] := 0;
  35.         dst := '';
  36.         good := true;
  37.         for i := 1 to length(src) div 4 do begin
  38.             base := i*4-3;
  39.             if (map[src[base]] >= 0) & (map[src[base+1]] >= 0) & (map[src[base+2]] >= 0) & (map[src[base+3]] >= 0) then begin
  40.                 n := bsl(map[src[base]], 18) + bsl(map[src[base+1]], 12) + bsl(map[src[base+2]], 6) + map[src[base+3]];
  41.                 dst := concat( dst, chr( band( bsr(n, 16), $00FF) ) );
  42.                 if src[base+2] <> base64_pad then begin
  43.                     dst := concat( dst, chr( band( bsr(n, 8), $00FF) ) );
  44.                 end;
  45.                 if src[base+3] <> base64_pad then begin
  46.                     dst := concat( dst, chr( band( bsr(n, 0), $00FF) ) );
  47.                 end;
  48.             end else begin
  49.                 good := false;
  50.                 leave;
  51.             end;
  52.         end;
  53.         if not good then begin
  54.             dst := '';
  55.         end;
  56.         DecodeBase64 := good;
  57.     end;
  58.     
  59. end.
  60.  
  61. Authorization: Basic c3F1ZWFtaXNoOm9zc2lmcmFnZQ==
  62.  
  63.  
  64. The username used above should be "squeamish" and the password "ossifrage".
  65.